package com.hero.gateway.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.constants.ZuulConstants;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.Response;

@Component // 该组件需要注册到spring中
@RefreshScope // 在使用配置参数的类中加入该注解，因为该类是直接注入的，所以在该类上加入一个后门
public class PreFilter extends ZuulFilter {

    @Value("${token}")
    private Boolean token;

    @Override
    public String filterType() { // 过滤器的类型: pre,route,post,error
        return FilterConstants.PRE_TYPE; // FilterConstants 有提供常量值
    }

    @Override
    public int filterOrder() {// 同类型的过滤器类型执行优先级设置，跨越不了其他类型过滤器
        return 0; // 同级过滤器类型中，值越小，优先级越大，可为负数
    }

    @Override
    public boolean shouldFilter() {// 是否启用当前过滤器
        // true，启动，false， 不启动;
        // 这里的状态，需要上一级过滤器给出状态，如果上一级给出cxt.setSendZuulResponse(false); 则不执行
        // cxt.setSendZuulResponse(true);  则执行
        /*RequestContext cxt = RequestContext.getCurrentContext();
        cxt.sendZuulResponse();*/
        return true;

    }

    @Override
    public Object run() { // 需要拦截的逻辑核心
        // 当前方法的object spring cloud 只是做了一个可扩展而已，可返回，可不返回
        // 对当前的请求进行了包装，类似springboot中的request
        RequestContext cxt = RequestContext.getCurrentContext();
        HttpServletRequest request = cxt.getRequest();
        System.out.println("-------------------------->> 获取到的远程配置结果：token = "  + token);
        if(token) {
            String tokenval = request.getHeader("token");
            if (StringUtils.isEmpty(tokenval)) {
                cxt.setSendZuulResponse(false); // 在这里已经异常了，告诉后面的过滤器，不用执行了
                cxt.setResponseStatusCode(401);// 放回请求状态
                BaseRespose<String> msg = new BaseRespose<>(401, "access without permission,please login !");
                cxt.setResponseBody(msg.toString()); // 返回异常提示信息
            } else {
            }
        }
        return null;
    }
}
